package calvin.study.rabbitmq.config;

import java.util.ArrayList;
import java.util.List;

import com.rabbitmq.client.Connection;

public abstract class RabbitMqBase {
	
	/**
	 * 存储所有到MQ的连接
	 */
	protected List<RabbitMqModel> mqModels = new ArrayList<RabbitMqModel>();
	
	/**
	 * 存储mq的队列的配置信息
	 */
	protected RabbitMqConfig rabbitmqConfig = null;
	
	/**
	 * 获取到MQ服务器的连接
	 * @param rabbitmqConfig
	 * @return
	 */
	protected abstract RabbitMqModel initConnection(Connection conn);
	
	/**
	 * 设定Rabbitmq配置信息
	 * @param rabbitmqConfig 配置信息
	 */
	public void setRabbitMqQueueConfig(RabbitMqConfig rabbitmqConfig) {
		this.rabbitmqConfig = rabbitmqConfig;
	}
	
	/**
	 * 初始化MQ的连接
	 */
	public void init() {
		mqModels.clear(); // 清空当前连接
		RabbitMqConnection connections = RabbitMqConnection.getInstance();
		for(Connection conn : connections.getMqConnections()){
			RabbitMqModel mqModel = initConnection(conn);
			if (null == mqModel) {
				mqModel = new RabbitMqModel(conn,null);
			}
			mqModels.add(mqModel);
		}
	}
	
	protected RabbitMqModel getMQ() {
		//主从方式（默认第一个为主连接，主连接出问题启用副连级）
		int curPosition = 0;
		RabbitMqModel mqModel = null;
		while (null == mqModel) {
			// 首先获取一个连接，如果连接有问题就尝试修复，如果修复不成功就获取下一个连接，依此类推直到找到正常的连接
			// 如果找不到这样的连接，就抛出异常
			mqModel = mqModels.get(curPosition++);
			
			if(curPosition >= mqModels.size()){
				break;
			}
		}
		return mqModel;
	}
	

}
